CREATE OR REPLACE PACKAGE BODY PA_USER
IS
   currentuser utilisateur%ROWTYPE;
   
   -- Get Utilisateur
   
    FUNCTION Get(p_num_user in number)
		RETURN utilisateur%ROWTYPE
	IS
		CURSOR c_user(numuser in number)
		IS
			SELECT 
				*
            FROM 
                 UTILISATEUR
			WHERE
				NUM_UTILISATEUR=numuser;
	BEGIN
		OPEN c_user(p_num_user);
		FETCH c_user INTO currentuser;

		IF c_user%NOTFOUND THEN
			RAISE NO_DATA_FOUND;
		END IF;

		CLOSE c_user;
		RETURN currentuser;
	END Get;
	
	-- CountByEmail
	
	FUNCTION CountByEmail (p_email_user in VARCHAR2)
		RETURN number
	IS
		nb_emails number;
	BEGIN
		select 
			count(*) into nb_emails
		from 
			utilisateur
		where
			email_utilisateur = lower(p_email_user);
		
		return nb_emails;
	END CountByEmail;
	
	-- Add Utilisateur
	
	PROCEDURE Add
	(
		  p_nom_user in VARCHAR2
		, p_prenom_user in VARCHAR2
		, p_email_user in VARCHAR2
		, p_password_user in VARCHAR2
		, p_rue_user in VARCHAR2
		, p_ville_user in VARCHAR2
		, p_cp_user in VARCHAR2
		, p_pays_user in VARCHAR2
		, p_phone_user in VARCHAR2
	)
	AS
	BEGIN
		INSERT INTO 
			UTILISATEUR 
			(
				  NUM_UTILISATEUR
				, NOM_UTILISATEUR
				, PRENOM_UTILISATEUR
				, EMAIL_UTILISATEUR
				, PASSWORD_UTILISATEUR
				, KEY_UTILISATEUR
				, RUE_UTILISATEUR
				, VILLE_UTILISATEUR
				, CP_UTILISATEUR
				, PAYS_UTILISATEUR
				, PHONE_UTILISATEUR
				, DATESTART_UTILISATEUR
				, IS_ADMIN
			)
		VALUES 
			(
				  SEQ_UTILISATEUR.nextval
				, upper(p_nom_user)
				, initcap(p_prenom_user)
				, lower(p_email_user)
				, getEncodedPassword(p_password_user)
				, DBMS_CRYPTO.HASH (utl_raw.cast_to_raw('3vb2MA3E49c7cM5' || p_password_user || 'O4T3W6jx57B35c8'), 2)
				, initcap(p_rue_user)
				, upper(p_ville_user)
				, p_cp_user
				, upper(p_pays_user)
				, p_phone_user
				, SYSDATE
				, 0
			);
            
		COMMIT;
	END;
	
	PROCEDURE UpdPassword
	(
		  p_num_utilisateur in number
		, p_new_password_user in varchar2
	)
	AS
	BEGIN
		update 
			utilisateur
		set
			password_utilisateur = getEncodedPassword(p_new_password_user)
		where
			num_utilisateur = p_num_utilisateur;
			
		commit;
	END;
	
	PROCEDURE UpdInfos
	(
		  p_num_utilisateur in number
		, p_nom_user in VARCHAR2
		, p_prenom_user in VARCHAR2
		, p_rue_user in VARCHAR2
		, p_ville_user in VARCHAR2
		, p_cp_user in VARCHAR2
		, p_pays_user in VARCHAR2
		, p_phone_user in VARCHAR2
	)
	AS
	BEGIN
		update
			utilisateur
		set
			  nom_utilisateur = p_nom_user
			, prenom_utilisateur = p_prenom_user
			, rue_utilisateur = p_rue_user
			, ville_utilisateur = p_ville_user
			, cp_utilisateur = p_cp_user
			, pays_utilisateur = p_pays_user
			, phone_utilisateur = p_phone_user
		where
			num_utilisateur = p_num_utilisateur;
			
		commit;
			
	END;
	
	
	PROCEDURE UpdEmail
	(
		  p_num_utilisateur in number
		, p_email_user in varchar2
	)
	AS
	BEGIN
		update 
			utilisateur
		set
			email_utilisateur = p_email_user
		where
			num_utilisateur = p_num_utilisateur;
			
		commit;
	END;
	
	
	FUNCTION getEncodedPassword(p_password in varchar2) RETURN varchar2
	IS
		encoded_password varchar2(64);
	BEGIN
		select 
			DBMS_CRYPTO.HASH (utl_raw.cast_to_raw(p_password), 3) into encoded_password
		from dual;
		
		return encoded_password;
	END;
	
END PA_USER;
/